package slic.equipos;

import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;

import slic.inscripcion.InscripcionStatus;
import slic.model.Alumno;
import slic.model.CategoriaDisciplina;
import slic.model.Deportista;
import slic.model.Director;
import slic.model.Disciplina;
import slic.model.Equipo;
import slic.model.Escuela;
import slic.model.Inscripcion;
import slic.model.PruebaDisciplina;
import slic.model.PruebaInscripcion;
import slic.service.AlumnoLocalServiceUtil;
import slic.service.CategoriaDisciplinaLocalServiceUtil;
import slic.service.DeportistaLocalServiceUtil;
import slic.service.DirectorLocalServiceUtil;
import slic.service.DisciplinaLocalServiceUtil;
import slic.service.EquipoLocalServiceUtil;
import slic.service.EscuelaLocalServiceUtil;
import slic.service.InscripcionLocalServiceUtil;
import slic.service.ProfesorLocalServiceUtil;
import slic.service.PruebaInscripcionLocalServiceUtil;
import slic.service.persistence.InscripcionUtil;
import slic.service.persistence.PruebaDisciplinaUtil;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.Group;
import com.liferay.portal.model.User;
import com.liferay.portal.theme.ThemeDisplay;

/**
 * Clase obsoleta. La logica de esta clase ha sido movida a la clase Inscripcion.
 */
public class Equipos {

	private static Log _log = LogFactoryUtil.getLog(Equipos.class);

	public static void saveEquipo(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {


		String equipoId = actionRequest.getParameter("equipoId");
		if (equipoId != null && !equipoId.trim().equals("")) {
			actionRequest.setAttribute("equipoId", equipoId);
		}

		String nombre = actionRequest.getParameter("nombre");
		if (nombre == null || nombre.trim().equals("")) {
			SessionErrors.add(actionRequest, "no-nombre");
		}

		Escuela escuela = null;
		String escuelaId = actionRequest.getParameter("escuelaId");
		if (escuelaId == null || escuelaId.trim().equals("")) {
			SessionErrors.add(actionRequest, "no-escuela");
		}
		else {
			escuela = EscuelaLocalServiceUtil.fetchEscuela(Long.valueOf(escuelaId));
		}

		CategoriaDisciplina categoria = null;
		String categoriaId = actionRequest.getParameter("categoriaId");
		if (categoriaId == null || categoriaId.trim().equals("")) {
			SessionErrors.add(actionRequest, "no-disciplina");
		}
		else {
			categoria = CategoriaDisciplinaLocalServiceUtil.fetchCategoriaDisciplina(Long.valueOf(categoriaId));
		}

		if (!SessionErrors.isEmpty(actionRequest)) {
			actionResponse.setRenderParameter("jspPage", "/html/equipos/edit.jsp");
			return;
		}

		try {
			ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
			User currentUser = themeDisplay.getUser();

			Equipo equipo;

			if (equipoId != null && !equipoId.trim().equals("")) {
				// Edición Process Document existente
				equipo = EquipoLocalServiceUtil.getEquipo(Long.valueOf(equipoId));
				equipo.setNombre(nombre);
				EquipoLocalServiceUtil.updateEquipo(equipo);
			} else {
				// Creación Process Document
				equipo = EquipoLocalServiceUtil.add(nombre, escuela.getEscuelaId(),
						categoria.getCategoriaId(), currentUser.getUserId());
			}

			actionResponse.setRenderParameter("equipoId", String.valueOf(equipo.getEquipoId()));
			actionResponse.setRenderParameter("jspPage", "/html/equipos/detail.jsp");
		} catch (Exception e) {
			_log.error(e);
			SessionErrors.add(actionRequest, "unknow-error");
		}


	}

	public static void asignarDeportistaAEquipo(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		String alumnoId = actionRequest.getParameter("alumnoId");
		String equipoId = actionRequest.getParameter("equipoId");
		String deportistaId = actionRequest.getParameter("deportistaId");

		Equipo equipo = EquipoLocalServiceUtil.fetchEquipo(Long.valueOf(equipoId));
		CategoriaDisciplina categoriaDisciplina = CategoriaDisciplinaLocalServiceUtil.fetchCategoriaDisciplina(equipo.getCategoriaId());
		Disciplina disciplina = DisciplinaLocalServiceUtil.fetchDisciplina(categoriaDisciplina.getDisciplinaId());
		
		Deportista deportista = null;

		ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
		User user = themeDisplay.getUser();

		actionResponse.setRenderParameter("equipoId", String.valueOf(equipo.getEquipoId()));
		actionResponse.setRenderParameter("jspPage", "/html/equipos/detail.jsp");

		if (deportistaId != null && !deportistaId.trim().equals("")) {
			deportista = DeportistaLocalServiceUtil.fetchDeportista(Long.valueOf(deportistaId));
		}
		else {
			Alumno alumno = AlumnoLocalServiceUtil.fetchAlumno(Long.valueOf(alumnoId));

			try {
				deportista = DeportistaLocalServiceUtil.registrarDeportista(alumno, user, false, false);
			} catch (PortalException e) {
				_log.error(e);
				SessionErrors.add(actionRequest, "unknow-error");
			}
		}

		if (equipo == null || deportista == null)
			return;

		List<Inscripcion> listInscripcionEquipo = InscripcionLocalServiceUtil.findByEquipoId(equipo.getEquipoId());
		if (listInscripcionEquipo.size() == disciplina.getMaximoPorEquipo())
			SessionErrors.add(actionRequest, "maximo-por-equipo");
		
		if (equipo.getEscuelaId() != deportista.getEscuelaId())
			SessionErrors.add(actionRequest, "deportista-distinta-escuela");

		List<Inscripcion> listInscripcionDeportista = InscripcionLocalServiceUtil.findByDeportistaId(deportista.getDeportistaId());		
		for (Inscripcion inscripcionDeportista : listInscripcionDeportista) {
			if (Long.valueOf(equipoId).equals(inscripcionDeportista.getEquipoId())) {
				SessionErrors.add(actionRequest, "deportista-ya-esta");
			}
			else {
				Equipo equipoDeportista = EquipoLocalServiceUtil.fetchEquipo(inscripcionDeportista.getEquipoId());
				if (equipoDeportista.getCategoriaId() == equipo.getCategoriaId() && equipoDeportista.getEstado() > 0) {
					SessionErrors.add(actionRequest, "deportista-otro-equipo");
				}
			}
		}
		
		Calendar calendar = GregorianCalendar.getInstance();
		
		calendar.setTime(deportista.getFecha_nacimiento());
		int anioNacimiento = calendar.get(Calendar.YEAR);
		
		calendar.setTime(new Date());
		int anioActual = calendar.get(Calendar.YEAR);
		
		int aniosDeportista = anioActual - anioNacimiento;
		
		if (aniosDeportista > categoriaDisciplina.getEdadMaxima() || aniosDeportista < categoriaDisciplina.getEdadMinima())
			SessionErrors.add(actionRequest, "deportista-fuera-categoria");
		
		if (disciplina.getRequiereHabilitacion() && deportista.getInscripcionStatus() != InscripcionStatus.STATUS_ENABLED)
			SessionErrors.add(actionRequest, "deportista-no-habilitado");
				
		if (!SessionErrors.isEmpty(actionRequest))
			return;

		InscripcionLocalServiceUtil.add(equipo, deportista, user);

	}

	public static void quitarDeportistaDeEquipo(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		String equipoId = actionRequest.getParameter("equipoId");
		String deportistaId = actionRequest.getParameter("deportistaId");

		Equipo equipo = EquipoLocalServiceUtil.fetchEquipo(Long.valueOf(equipoId));
		Deportista deportista = DeportistaLocalServiceUtil.fetchDeportista(Long.valueOf(deportistaId));

		ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
		User user = themeDisplay.getUser();

		if (equipo.getCreateUser() != user.getUserId())
			SessionErrors.add(actionRequest, "usuario-creacion-no-coincide");

		actionResponse.setRenderParameter("equipoId", String.valueOf(equipo.getEquipoId()));
		actionResponse.setRenderParameter("jspPage", "/html/equipos/detail.jsp");

		if (!SessionErrors.isEmpty(actionRequest))
			return;

		InscripcionLocalServiceUtil.delete(equipo, deportista);
		SessionMessages.add(actionRequest, "request_processed", "Se ha quitado al alumno " + deportista.getApellido() + ", " +  deportista.getNombres());

	}

	public static void eliminarEquipo(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		String equipoId = actionRequest.getParameter("equipoId");

		Equipo equipo = EquipoLocalServiceUtil.fetchEquipo(Long.valueOf(equipoId));

		ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
		User user = themeDisplay.getUser();

		if (equipo.getCreateUser() != user.getUserId())
			SessionErrors.add(actionRequest, "usuario-creacion-no-coincide");
		
		if (equipo.getEstado() != 0)
			SessionErrors.add(actionRequest, "equipo-no-eliminable");

		if (!SessionErrors.isEmpty(actionRequest)) {
			actionResponse.setRenderParameter("equipoId", String.valueOf(equipo.getEquipoId()));
			actionResponse.setRenderParameter("jspPage", "/html/equipos/detail.jsp");
			return;
		}
		
		equipo.setEstado(-1);
		
		EquipoLocalServiceUtil.updateEquipo(equipo);
		SessionMessages.add(actionRequest, "equipo-eliminado");

		actionResponse.setRenderParameter("jspPage", "/html/equipos/view.jsp");
	}
	
	public static void enviarEquipo(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		String equipoId = actionRequest.getParameter("equipoId");

		Equipo equipo = EquipoLocalServiceUtil.fetchEquipo(Long.valueOf(equipoId));

		CategoriaDisciplina categoriaDisciplina = CategoriaDisciplinaLocalServiceUtil.fetchCategoriaDisciplina(equipo.getCategoriaId());
		Disciplina disciplina = DisciplinaLocalServiceUtil.fetchDisciplina(categoriaDisciplina.getDisciplinaId());
		List<PruebaDisciplina> listPruebaDisciplina = PruebaDisciplinaUtil.findByDisciplinaId(categoriaDisciplina.getDisciplinaId());

		ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
		User user = themeDisplay.getUser();

		if (equipo.getCreateUser() != user.getUserId())
			SessionErrors.add(actionRequest, "usuario-creacion-no-coincide");

		List<Inscripcion> listInscripcionEquipo = InscripcionLocalServiceUtil.findByEquipoId(Long.valueOf(equipoId));
		
		if (listInscripcionEquipo.size() < disciplina.getMinimoPorEquipo())
			SessionErrors.add(actionRequest, "minimo-por-equipo");
		
		for (Inscripcion inscripcionEquipo : listInscripcionEquipo) {
			if (listPruebaDisciplina != null && listPruebaDisciplina.size() > 0) {
				List<PruebaInscripcion> listPruebaInscripcion = PruebaInscripcionLocalServiceUtil.findByInscripcionId(inscripcionEquipo.getInscripcionId());
				if (listPruebaInscripcion != null && listPruebaInscripcion.size() == 0) {
					SessionErrors.add(actionRequest, "algun-deportista-sin-prueba");
				}
			}
			
			List<Inscripcion> listInscripcionDeportista = InscripcionLocalServiceUtil.findByDeportistaId(inscripcionEquipo.getDeportistaId());
			for (Inscripcion inscripcionDeportista : listInscripcionDeportista) {
				Equipo equipoDeportista = EquipoLocalServiceUtil.fetchEquipo(inscripcionDeportista.getEquipoId());
				if (equipoDeportista.getCategoriaId() == equipo.getCategoriaId() && equipoDeportista.getEstado() > 0) {
					SessionErrors.add(actionRequest, "algun-deportista-otro-equipo");
				}
			}
		}

		if (!SessionErrors.isEmpty(actionRequest)) {
			actionResponse.setRenderParameter("equipoId", String.valueOf(equipo.getEquipoId()));
			actionResponse.setRenderParameter("jspPage", "/html/equipos/detail.jsp");
			return;
		}
		
		equipo.setSendDate(new Date());
		equipo.setEstado(1);
		
		EquipoLocalServiceUtil.updateEquipo(equipo);
		SessionMessages.add(actionRequest, "equipo-enviado");

		actionResponse.setRenderParameter("jspPage", "/html/equipos/view.jsp");
	}

	static public void desenviarEquipo(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		String equipoId = actionRequest.getParameter("equipoId");

		Equipo equipo = EquipoLocalServiceUtil.fetchEquipo(Long.valueOf(equipoId));

		ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
		User user = themeDisplay.getUser();

		if (equipo.getCreateUser() != user.getUserId())
			SessionErrors.add(actionRequest, "usuario-creacion-no-coincide");

		if (equipo.getEstado() != 1)
			SessionErrors.add(actionRequest, "equipo-no-desenviable");

		actionResponse.setRenderParameter("equipoId", String.valueOf(equipo.getEquipoId()));
		actionResponse.setRenderParameter("jspPage", "/html/equipos/detail.jsp");
		
		if (!SessionErrors.isEmpty(actionRequest))
			return;
		
		equipo.setEstado(0);
		
		EquipoLocalServiceUtil.updateEquipo(equipo);
		SessionMessages.add(actionRequest, "equipo-desenviado");
	}

	public static void aprobarEquipo(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		String equipoId = actionRequest.getParameter("equipoId");

		Equipo equipo = EquipoLocalServiceUtil.fetchEquipo(Long.valueOf(equipoId));

		ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
		User user = themeDisplay.getUser();

		if (equipo.getEstado() != 1)
			SessionErrors.add(actionRequest, "equipo-no-aprobable");

		// busqueda de la escuela del director
		boolean directorDistintaEscuela = true;
		List<Director> listDirector = DirectorLocalServiceUtil.findByMail(user.getEmailAddress());
		
		for (Director director : listDirector) {
			if (director.getEscuelaId() == equipo.getEscuelaId()) {
				directorDistintaEscuela = false;
				break;
			}
		}
		
		if (directorDistintaEscuela)
			SessionErrors.add(actionRequest, "director-distinta-escuela");
		
		if (!SessionErrors.isEmpty(actionRequest)) {
			actionResponse.setRenderParameter("equipoId", String.valueOf(equipo.getEquipoId()));
			actionResponse.setRenderParameter("jspPage", "/html/equipos/detail.jsp");
			return;
		}
		
		equipo.setApprovalDate(new Date());
		equipo.setApprovalUser(user.getUserId());
		equipo.setEstado(2);
		
		EquipoLocalServiceUtil.updateEquipo(equipo);
		
		SessionMessages.add(actionRequest, "equipo-aprobado");

		actionResponse.setRenderParameter("jspPage", "/html/equipos/view.jsp");
	}

	public static void cancelarAprobacionEquipo(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		String equipoId = actionRequest.getParameter("equipoId");

		Equipo equipo = EquipoLocalServiceUtil.fetchEquipo(Long.valueOf(equipoId));

		ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
		User user = themeDisplay.getUser();

		if (equipo.getApprovalUser() != user.getUserId())
			SessionErrors.add(actionRequest, "usuario-aprobacion-no-coincide");
		
		if (equipo.getEstado() != 2)
			SessionErrors.add(actionRequest, "equipo-no-cancelable-aprobacion");

		actionResponse.setRenderParameter("equipoId", String.valueOf(equipo.getEquipoId()));
		actionResponse.setRenderParameter("jspPage", "/html/equipos/detail.jsp");
		
		if (!SessionErrors.isEmpty(actionRequest)) {
			return;
		}
		
		equipo.setEstado(1);
		
		EquipoLocalServiceUtil.updateEquipo(equipo);
		
		SessionMessages.add(actionRequest, "equipo-cancelada-aprobacion");
		
	}

	public static void savePruebas(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		long inscripcionId = Long.valueOf(actionRequest.getParameter("inscripcionId")).longValue();		
		Inscripcion inscripcion = InscripcionLocalServiceUtil.fetchInscripcion(inscripcionId);
		Equipo equipo = EquipoLocalServiceUtil.fetchEquipo(inscripcion.getEquipoId());

		ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
		User user = themeDisplay.getUser();

		if (equipo.getCreateUser() != user.getUserId())
			SessionErrors.add(actionRequest, "usuario-creacion-no-coincide");

		if (!SessionErrors.isEmpty(actionRequest)) {
			actionResponse.setRenderParameter("equipoId", String.valueOf(equipo.getEquipoId()));
			actionResponse.setRenderParameter("jspPage", "/html/equipos/detail.jsp");
			return;
		}

		PruebaInscripcionLocalServiceUtil.removeByInscripcionId(inscripcionId);

		String listaPruebaIds = actionRequest.getParameter("listaPruebaIds");

		if (listaPruebaIds != null && !listaPruebaIds.trim().equals("")) {
			for (String pruebaId : listaPruebaIds.trim().split(",")) {
				PruebaInscripcionLocalServiceUtil.add(inscripcionId, Long.valueOf(pruebaId).longValue());
			}
		}
		
		actionResponse.setRenderParameter("equipoId", String.valueOf(equipo.getEquipoId()));
		actionResponse.setRenderParameter("jspPage", "/html/equipos/detail.jsp");
	}

}
